//������������ ������ �2
//initializer_list, move, default, delete, move ���������

#include "stdafx.h"
#include "Header.h"
#include "Header1.h"
#include "myString.h"
#include "MyUniquePTR.h"
#include "Templates.h"

using namespace std;

int main()
{
	//������� 1. �������� �����, ������� ������ ������������� ���������������� 
	// ������� � ����������� ���������� ������ ���� � �������� ���������.
	//
	//��������:
	//� ����� ��������� ������ ����� ��������[1, 10].������������ ����� ������� � ��� ������
	//{ 2,-1,3,33, 5,2 }. � ���������� � ����� ������� ������ ��������� ��������{ 2,3,5 }
	//��������: 
	// ��� ������������� ��� ������������ �� ����� ������ ������� ��������, 
	// �������� �������������!��� ������� ������������� �������� ����� �������� ������!
	//�	��� �������� ��������� ����������� std::vector.
	{
	My_vector<int>v_int1;

	My_vector<int>v_int2(1, 10);
	v_int2 = { 2,-1,3,33, 5,2 };

	My_vector<int>v_int3(1, 10, { 2,-1,3,33, 5,2 });
	v_int3.change_range(3, 5);

	My_vector<int>v_int4(5, 13, { -2,1,8,6,15 });
	v_int1 = v_int4;
	My_vector<int>v_int5;
	v_int5 = std::move(v_int4);

	v_int1.back_insert({ 5,12,16,44,2,7,9,8,6 });
	v_int1.print_container();
	v_int1.erase_if({ 8,8,15,56,42,6,7,8,7 });
	v_int1.print_container();

	My_vector<string>v_str("a", "m", { "abc", "string", "lol", "c'mon", "abc" });
	v_str.Sort('>');
	v_str.print_container();
	_asm nop
	}

//o	������� 1 : ������������ std::vector � �������� ����������� �������
//o	������� 2 : ����������� ���� ����� �� std::vector � ��� ���� ����� ����� ������ ���� 
// ������������ ������������
//����������� ��� ��������!
//�	���������� �����������, ������� ����� ��������� ����� ���������� ��������
// (�������� ����� �����������)
//�	���������� ����� ���������� ������ ���������� ��������(�������� ����� �����������)
//�	���������� ����� �������� ������ ���������� ��������(�������� ����� �����������)
//�	���������� ����� ����������, ������� ����� ��������� � �������� ��������� 
// ������� �� ����������� / �� ��������
//�	� ������(�������� �� ��� ������) ������
//�	���� ���������� � ����� ������ �� ����������� ������������� ����������� �������������
	{
	My_vector1<int>v1_int;
	My_vector1<int>v1_int2(1, 10);
	My_vector1<int>v1_int3(1, 10, { 2,-1,3,33, 5,2 });
	v1_int3.print_container();
	v1_int3.pop_back();
	v1_int3.print_container();

	v1_int3.back_insert({ 5,12,16,44,2,7,9,8,6 });
	//int s = v1_int3.size();
	int s1 = v1_int3.Size();
	v1_int3.print_container();
	
	v1_int3.Sort();
	v1_int3.print_container();

	v1_int3.erase_if({ 5,12,16,44,2,7,9,8,6 });
	v1_int3.print_container();
	
	_asm nop
	}
// 
//������� 2. ���������� ������ ������ MyUniquePTR, ������� �������� �������� ��� ��������� 
// �� ������ ������ ����.
//������ � ����� ������ ������������ ����������� �������� ����������� ����������� ��������.
// ��������� ���������������� ������� �� ������� MyString :
{
	MyUniquePTR<MyString> p1(new MyString("abc"));
	cout << p1->GetString()<<endl;
	p1->SetNewString("qwerty");
	MyString  s2 = *p1;
	MyUniquePTR< MyString > p2 = move(p1); //����� ���������� ������ �������� ������ => 
	//���������!
	if (!p1) { std::cout << "No object!" << endl; } //� ��� ������ ��������
	MyUniquePTR< MyString > p3(new MyString("vvv"));
	//p3 = p2; //� ����� ���������� ������ �������� ������
	vector< MyUniquePTR< MyString >> v; //��� �������������������???
	v.push_back(new MyString("abc"));
	v.push_back(new MyString("vvv"));
	v.push_back(new MyString("qwerty"));
		
	print_container(v);
	cout << endl;
	
	//for_each(begin(v), end(v), [&](auto& s) {l.push_back(new MyString(*s)); });
	//using IT = vector<MyUniquePTR< MyString >>::iterator;
	list< MyUniquePTR< MyString >> l/*(move_iterator<IT>(v.begin()), move_iterator<IT>(v.end()))*/ ;
	copy(move_iterator/*<IT>*/(v.begin()), move_iterator/*<IT>*/(v.end()), back_inserter(l));
	print_container(l);
	print_container(v);
	//��� ����������� �� v � l ???
}
	return 0;
}